home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume89
/
devices
/
net.3
< prev
next >
Wrap
Internet Message Format
|
1989-09-16
|
52KB
Path: xanth!lll-winken!ames!sun-barr!newstop!sun!swap!page
From: page%swap@Sun.COM (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v89i176: net - network (net:) device, Part03/04
Message-ID: <124773@sun.Eng.Sun.COM>
Date: 15 Sep 89 07:29:53 GMT
Sender: news@sun.Eng.Sun.COM
Lines: 1647
Approved: page@sun.com
Submitted-by: sas!walker@mcnc.org (Doug Walker)
Posting-number: Volume 89, Issue 176
Archive-name: devices/net.3
# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
# handler/makefile
# handler/mount.c
# handler/netdnet.c
# handler/process.c
# handler/volume.c
# iodnet.c
# netcomm.h
# netdev.h
# netdnet.h
# proto.h
# request.c
# sendpkt.c
# server/device.c
# server/dir.c
# server/dispatch.c
# server/file.c
# This is archive 3 of a 4-part kit.
# This archive created: Fri Sep 15 00:24:32 1989
if `test ! -d handler`
then
mkdir handler
echo "mkdir handler"
fi
echo "extracting handler/makefile"
sed 's/^X//' << \SHAR_EOF > handler/makefile
X
X#DEBUG = -dDEBUG=1
XDEBUG =
X
X#LIBS = lib:lc.lib lib:amiga.lib define _SysBase = _AbsExecBase
XLIBS = lib:lc.lib lib:amiga.lib define _SysBase = 4
X
XLC1FLAGS = -cwusf -b -d $(DEBUG) -i/
XLC2FLAGS = -v
X
Xnetdnet-handler: netdnet-handler.d
X @blink from $+ to $@ nodebug
X
Xnetser-handler: netser-handler.d
X @blink from $+ to $@ nodebug
X
Xnetpar-handler: netpar-handler.d
X @blink from $+ to $@ nodebug
X
Xnetsing-handler: netsing-handler.d
X @blink from $+ to $@ nodebug
X
Xnetdnet-handler.d: main.o /subs.o file.o dir.o io.o lock.o process.o\
X /sendpkt.o volume.o device.o /request.o mount.o devio.o\
X netdnet.o /iodnet.o /dnetlib.o /debug.o /timer.o
X @echo >ram:tmp.with "from $+"
X @assign blinkwith:
X @blink with ram:tmp.with SC SD VERBOSE BATCH to $@ lib $(LIBS)\
X map netdnet-handler.map hx
X @protect $@ -e
X
Xnetsing-handler.d: main.o /subs.o file.o dir.o io.o lock.o process.o\
X /sendpkt.o volume.o device.o /request.o mount.o devio.o\
X netsing.o iosing.o /debug.o /timer.o
X @echo >ram:tmp.with "from $+"
X @assign blinkwith:
X @blink with ram:tmp.with SC SD VERBOSE BATCH to $@ lib $(LIBS)
X @protect $@ -e
X
Xnetser-handler.d: main.o /subs.o file.o dir.o io.o lock.o process.o \
X /sendpkt.o volume.o device.o /request.o mount.o devio.o\
X netser.o /ioser.o /debug.o /timer.o
X @echo >ram:tmp.with "from $+"
X @assign blinkwith:
X @blink with ram:tmp.with SC SD VERBOSE BATCH to $@ lib $(LIBS)
X @protect $@ -e
X
Xnetpar-handler.d: main.o /subs.o file.o dir.o io.o lock.o process.o \
X /sendpkt.o volume.o device.o /request.o mount.o devio.o\
X netpar.o /iopar.o /debug.o /timer.o
X @echo >ram:tmp.with "from $+"
X @assign blinkwith:
X @blink with ram:tmp.with SC SD VERBOSE BATCH to $@ lib $(LIBS)
X @protect $@ -e
X
Xmain.o : main.c handler.h /netcomm.h
X @echo "Compiling $<"
X @lc1 -. $(LC1FLAGS) -oram:temp.q $<
X @lc2 -. $(LC2FLAGS) -y -o$@ ram:temp.q
X
X/dnetlib.o : /dnetlib.c
X @echo "Compiling $<"
X @lc1 -. $(LC1FLAGS) -oram:temp.q $<
X @lc2 -. $(LC2FLAGS) -y -o$@ ram:temp.qSHAR_EOF
echo "extracting handler/mount.c"
sed 's/^X//' << \SHAR_EOF > handler/mount.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery. All Rights */
X/* |. o.| || Reserved. This program may not be distributed without the */
X/* | . | || permission of the authors: BBS: */
X/* | o | || John Toebes Doug Walker Dave Baker */
X/* | . |// */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* Volume Manipulation */
X/* mount */
X#include "handler.h"
X
X/* Define a BCPL volume name as a default */
X#define NETNAME "\7Network"
X
Xvoid DisMount(global)
XGLOBAL global;
X{
X struct DeviceList *volume;
X struct DosInfo *info;
X struct RootNode *root;
X
X BUG(("Dismount: Entry\n"));
X
X /* start at the root of the device list */
X root = (struct RootNode *)DOSBase->dl_Root;
X info = (struct DosInfo *)BADDR(root->rn_Info);
X volume = (struct DeviceList *)BADDR(info->di_DevInfo);
X
X /* See if we have a current volume that we have to get rid of ? */
X /* Make sure there are no outstanding locks for the volume */
X if ((global->volume != NULL) && (global->volume->dl_Lock == NULL))
X {
X /* This volume needs to be removed from the list */
X /* First locate it on the list */
X Forbid();
X
X /* is it at the head of the list? */
X if (volume == global->volume)
X /* sure enough, just get rid of it */
X info->di_DevInfo = volume->dl_Next;
X else
X {
X /* Find it in the list */
X while(volume != NULL &&
X (struct DeviceList *)(BADDR(volume->dl_Next)) != global->volume)
X volume = (struct DeviceList *)BADDR(volume->dl_Next);
X
X /* if we found it then take it out of the chain */
X if (volume != NULL)
X volume->dl_Next = global->volume->dl_Next;
X }
X Permit();
X
X if (global->volume)
X {
X DosFreeMem((char *)global->volume);
X }
X }
X
X global->volume = NULL;
X}
X
Xvoid Mount(global, name)
XGLOBAL global;
Xchar *name;
X{
X struct DeviceList *volume;
X struct DosInfo *info;
X struct RootNode *root;
X short newlen; /* Cause memcmp to use the most efficient code */
X
X BUGP("Mount: Entry")
X BUG(("Mount: Entry\n"));
X
X global->n.ErrorCount = 0;
X
X if(name == NULL) name = NETNAME;
X newlen = *name + 1;
X
X /* Now find it on the device list. */
X /* First start at the root of the device list */
X root = (struct RootNode *)DOSBase->dl_Root;
X info = (struct DosInfo *)BADDR(root->rn_Info);
X volume = (struct DeviceList *)BADDR(info->di_DevInfo);
X
X BUGBSTR("Volume name is : ", name);
X
X /* Can't let the system change the list underneath us... */
X Forbid();
X
X /* Now run through the list until we come up empty OR we find it */
X while(volume != NULL)
X {
X if (volume->dl_Type == DLT_VOLUME &&
X !memcmp(name, (char *)BADDR(volume->dl_Name), newlen) &&
X volume->dl_VolumeDate.ds_Days == 0L &&
X volume->dl_VolumeDate.ds_Minute == 0L &&
X volume->dl_VolumeDate.ds_Tick == 0L)
X break;
X volume = (struct DeviceList *)BADDR(volume->dl_Next);
X }
X
X Permit();
X
X BUG(("mount: Volume is %08lx\n", volume));
X
X /* OK, now did we find it? */
X if (volume != NULL)
X {
X BUGP("Got volume")
X BUG(("Got a matching node\n"));
X
X /* Sure did, We probably need to check to see if another handler has */
X /* it to work with, but for now we assume only onw such volume can */
X /* exist. This was a problem with all but the latest version of 1.2 */
X /* If we have write access, we should probably nudge the ticks by one*/
X /* just to make it unique */
X }
X else
X /* No such volume is known to the system. So we will just have to */
X /* allocate a node to put everything on. */
X {
X BUGP("No volume")
X volume = (struct DeviceList *)
X DosAllocMem(global, sizeof(struct DeviceList)+newlen);
X
X BUG(("Created new node at %08lx\n", volume));
X
X /* Note that volume+1 gets us to the extra memory we allocated. */
X /* Just a lot simpler to write that in C than ...+sizeof(...) */
X MQ(name, (char *)(volume + 1), newlen);
X volume->dl_VolumeDate.ds_Days = 3800L;
X volume->dl_VolumeDate.ds_Minute =
X volume->dl_VolumeDate.ds_Tick = 0L;
X volume->dl_Name = (BSTR)MKBADDR((volume + 1));
X volume->dl_Lock = NULL;
X volume->dl_Type = DLT_VOLUME;
X
X /* Also we need to link it into the list */
X Forbid();
X volume->dl_Next = info->di_DevInfo;
X info->di_DevInfo = MKBADDR(volume);
X Permit();
X }
X
X /* Now we can own the volume by giving it our task id */
X volume->dl_Task = global->n.port;
X volume->dl_DiskType = ID_DOS_DISK;
X
X /* all set up, remember what our base volume is */
X global->volume = volume;
X
X BUGP("Mount: Exit")
X}
X
SHAR_EOF
echo "extracting handler/netdnet.c"
sed 's/^X//' << \SHAR_EOF > handler/netdnet.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
X* |_o_o|\\ Copyright (c) 1988 The Software Distillery. All Rights Reserved *
X* |. o.| || Written by Doug Walker *
X* | . | || The Software Distillery *
X* | o | || 235 Trillingham Lane *
X* | . |// Cary, NC 27513 *
X* ====== BBS:(919)-471-6436 *
X\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X
X#include "netdnet.h"
X#include "handler.h"
X
X#ifdef CPR
Xchar *dbgwind = "CON:0/0/640/160/NETDNET-HANDLER/a";
X#endif
X
X#if 1
X
Xint ReSync(global, ioptr)
XGLOBAL global;
XAPTR ioptr;
X{
X TermRDevice(global, 1);
X return(InitRDevice(global));
X}
X
X#else
X
Xint ReSync(global, ioptr)
XGLOBAL global;
XAPTR ioptr;
X{
X return(1);
X}
X
X#endif
X
Xint InitRDevice(global)
XGLOBAL global;
X{
X struct MsgPort *chan;
X struct NetNode *tmpnode;
X struct RPacket RP;
X static doinit = 1;
X
X if(!doinit)
X {
X BUG(("InitRDevice: Init loop, exiting\n"))
X return(1);
X }
X
X doinit = 0;
X
X BUG(("InitRDevice: Initializing for DNET operation on unit %d\n",
X global->unitnum));
X
X BUGP("InitRDevice: Entry")
X
X if(!(chan=DOpen(NULL, (uword)(PORT_FHANDLER), 20, 15)))
X {
X BUG(("********ERROR: Can't DOpen!!\n"));
X BUGR("Can't open channel!")
X }
X if(chan) DQueue((struct DChannel *)chan, 32);/* Is this really necessary? */
X BUG(("DNET Channel %lx open\n", chan));
X
X if(!global->netchain.next)
X {
X if(tmpnode=AddNode(global, "\3Foo", (APTR)chan))
X strcpy(tmpnode->devname, "ROOT:");
X }
X else if(chan)
X {
X /* Preserve state of global->RP */
X memcpy((char *)&RP, (char *)&global->RP, sizeof(struct RPacket));
X
X for(tmpnode=global->netchain.next; tmpnode; tmpnode=tmpnode->next)
X {
X BUG(("ReSync: Trying to resync '%s'\n", tmpnode->devname))
X
X global->RP.Type = ACTION_NETWORK_KLUDGE;
X strcpy(global->RP.Data, tmpnode->devname);
X global->RP.DLen = strlen(global->RP.Data);
X tmpnode->RootLock.RDevice = (RPTR)1L;
X tmpnode->ioptr = (APTR)chan;
X tmpnode->status = NODE_UP;
X if(RemotePacket(global, &tmpnode->RootLock))
X {
X tmpnode->status = NODE_CRASHED;
X BUG(("ReSync: Failed\n"))
X }
X }
X memcpy((char *)&global->RP, (char *)&RP, sizeof(struct RPacket));
X }
X
X
X doinit = 1;
X
X BUGP("InitRDevice: Exit")
X
X return(chan != NULL);
X}
X
Xint TermRDevice(global, status)
XGLOBAL global;
Xint status;
X{
X struct NetNode *netnode;
X
X for(netnode=global->netchain.next; netnode; netnode=netnode->next)
X {
X if(netnode->ioptr)
X {
X netnode->status = NODE_DEAD;
X if(!status) DClose((struct DChannel *)netnode->ioptr);
X netnode->ioptr = NULL;
X }
X }
X
X return(0);
X}
X
Xvoid ActNetHello(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X{
X}
SHAR_EOF
echo "extracting handler/process.c"
sed 's/^X//' << \SHAR_EOF > handler/process.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery. All Rights */
X/* |. o.| || Reserved. This program may not be distributed without the */
X/* | . | || permission of the authors: BBS: */
X/* | o | || John Toebes Doug Walker Dave Baker */
X/* | . |// */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* Process Control */
X
X/* ActDie ActInhibit ActFlush ActTimer */
X#include "handler.h"
X
Xvoid ActDie(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt; /* a pointer to the dos packet sent */
X{
X struct NetNode *netnode;
X BUG(("ActDie\n"));
X global->n.run = 0;
X global->RP.Type = pkt->dp_Type;
X
X for(netnode=global->netchain.next; netnode; netnode=netnode->next)
X {
X if(netnode->status == NODE_UP && netnode->RootLock.RDevice)
X {
X BUGBSTR("Shutting down node ", netnode->name);
X RemotePacket(global, &netnode->RootLock);
X netnode->status = NODE_DEAD;
X }
X }
X}
X
Xvoid ActInhibit(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt; /* a pointer to the dos packet sent */
X{
X BUG(("ActInhibit: %ld\n", pkt->dp_Arg1));
X pkt->dp_Res1 = DOS_TRUE;
X if(pkt->dp_Arg1 == 0)
X {
X /* Since the DISKCHANGE command uses ACTION_INHIBIT instead of */
X /* ACTION_DISK_CHANGE, do a ACTION_DISK_CHANGE just in case */
X ActDiskChange(global, pkt);
X }
X}
X
Xvoid ActFlush(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X{
X BUG(("ActFlush\n"));
X}
X
X#if 0
Xvoid ActTimer(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt; /* a pointer to the dos packet sent */
X{
X BUG(("ActTimer\n"));
X
X if (global->run == -1)
X global->run = 0;
X else
X PostTimerReq(global);
X
X /* Prevent them from replying to the message */
X global->reply = 0;
X}
X#endif
SHAR_EOF
echo "extracting handler/volume.c"
sed 's/^X//' << \SHAR_EOF > handler/volume.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery. All Rights */
X/* |. o.| || Reserved. This program may not be distributed without the */
X/* | . | || permission of the authors: BBS: */
X/* | o | || John Toebes Doug Walker Dave Baker */
X/* | . |// */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* Volume Manipulation */
X/* ActCurentVol ActRenameDisk ActDiskInfo ActInfo ActDiskChange*/
X
X#include "handler.h"
X
Xstatic void GetInfo U_ARGS((GLOBAL, struct DosPacket *, struct InfoData *));
X
Xvoid ActCurentVol(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt; /* a pointer to the dos packet sent */
X{
X BUG(("ActCurentVol\n"));
X pkt->dp_Res1 = MKBADDR(global->volume);
X}
X
Xvoid ActRenameDisk(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt; /* a pointer to the dos packet sent */
X{
X BUG(("ActRenameDisk\n"));
X
X DisMount(global);
X Mount(global, (char *)pkt->dp_Arg1);
X
X pkt->dp_Res1 = DOS_TRUE;
X}
X
Xvoid GetInfo(global, pkt, info)
XGLOBAL global;
Xstruct DosPacket *pkt;
Xstruct InfoData *info;
X{
X BUG(("GetInfo\n"));
X
X if(global->volume == NULL)
X {
X info->id_DiskType = ID_NO_DISK_PRESENT;
X pkt->dp_Res1 = DOS_FALSE;
X }
X else
X {
X info->id_NumSoftErrors = global->n.ErrorCount;
X info->id_UnitNumber = global->unitnum;
X if(global->upnodes>1)
X {
X info->id_DiskState = ID_VALIDATED;
X info->id_DiskType = ID_DOS_DISK;
X }
X else
X {
X info->id_DiskState = ID_VALIDATING;
X info->id_DiskType = ID_NO_DISK_PRESENT;
X }
X info->id_NumBlocks = global->numnodes;
X info->id_NumBlocksUsed = global->upnodes;
X info->id_VolumeNode = MKBADDR(global->volume);
X info->id_InUse = 0;
X pkt->dp_Res1 = DOS_TRUE;
X }
X BUG(("GetInfo: Exit\n"));
X}
X
Xvoid ActDiskInfo(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X{
X BUG(("ActDiskInfo\n"));
X GetInfo(global, pkt, (struct InfoData *)pkt->dp_Arg1);
X}
X
Xvoid ActInfo(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt; /* a pointer to the dos packet sent */
X{
X struct FileLock *flock;
X NETPTR nlock;
X
X BUG(("ActInfo\n"));
X
X flock = (struct FileLock *)pkt->dp_Arg1;
X
X if(flock == NULL || flock->fl_Volume != MKBADDR(global->volume) ||
X (nlock=(NETPTR)flock->fl_Key)->RPtr == NULL)
X GetInfo(global, pkt, (struct InfoData *)pkt->dp_Arg2);
X else
X {
X /* It is a remote lock - query the remote fs */
X global->RP.Type = pkt->dp_Type;
X global->RP.Arg1 = (LONG)nlock->RPtr;
X global->RP.DLen = 0;
X
X if(!RemotePacket(global, nlock))
X MQ(global->RP.Data, pkt->dp_Arg2, sizeof(struct InfoData));
X }
X}
X
Xvoid ActNetKludge(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X{
X struct NetNode *netnode;
X /* Arg1: BPTR to null-terminated BCPL string of name of network node */
X /* Arg2: BPTR to null-terminated string of name of device to use */
X
X global->RP.Type = ACTION_NETWORK_KLUDGE;
X strcpy(global->RP.Data, (char *)pkt->dp_Arg2);
X global->RP.DLen = strlen((char *)pkt->dp_Arg2);
X if(!(netnode = FindNode(global, (char *)pkt->dp_Arg1+1)) &&
X global->netchain.next)
X {
X BUG(("ActNetKludge: Adding node %s len %d\n",
X pkt->dp_Arg1+1, (int)*((unsigned char *)pkt->dp_Arg1)));
X
X if(netnode=AddNode(global,
X (char *)pkt->dp_Arg1, global->netchain.next->ioptr))
X strcpy(netnode->devname, (char *)pkt->dp_Arg2);
X }
X else if(netnode->status != NODE_UP)
X ReSync(global, netnode->ioptr);
X
X if(!netnode || netnode->status != NODE_UP || !netnode->RootLock.RDevice)
X {
X BUG(("ActNetKludge: node %s netnode %08lx unavailable\n",
X pkt->dp_Arg1, netnode));
X pkt->dp_Res1 = DOS_FALSE;
X pkt->dp_Res2 = ERROR_NODE_DOWN;
X }
X else
X if(RemotePacket(global, &netnode->RootLock))
X netnode->status = NODE_CRASHED;
X}
X
Xvoid ActDiskChange(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X{
X BUG(("ActDiskChange\n"));
X}
SHAR_EOF
echo "extracting iodnet.c"
sed 's/^X//' << \SHAR_EOF > iodnet.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
X* |_o_o|\\ Copyright (c) 1988 The Software Distillery. All Rights Reserved *
X* |. o.| || Written by Doug Walker *
X* | . | || The Software Distillery *
X* | o | || 235 Trillingham Lane *
X* | . |// Cary, NC 27513 *
X* ====== BBS:(919)-471-6436 *
X\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X#define NETCOMMON
X#include "netdnet.h"
X#include "netcomm.h"
X#include "proto.h"
X
Xint PutRPacket(global, ioptr)
XNGLOBAL global;
XAPTR ioptr;
X{
X int len;
X
X BUG(("PutRPacket: type %d, Args %lx %lx %lx %lx\n", global->RP.Type,
X global->RP.Arg1, global->RP.Arg2,
X global->RP.Arg3, global->RP.Arg4));
X
X
XTOP:
X BUG(("PutRPacket: writing %d to %lx. . .", RPSIZE, ioptr));
X if((len=DWrite((struct DChannel *)ioptr,
X (char *)&global->RP, RPSIZE)) != RPSIZE)
X {
X BUG(("**********ERROR - wrote %d instead\n", len));
X BUGR("Write error");
X if(ReSync(global, ioptr)) return(1);
X else goto TOP;
X }
X BUG(("%d written\n", len));
X
X if(global->RP.DLen)
X {
X BUG(("PutRPacket: writing %d to %lx. . .", global->RP.DLen, ioptr));
X if((len=DWrite((struct DChannel *)ioptr,
X global->RP.Data, global->RP.DLen)) != global->RP.DLen)
X {
X BUG(("**********ERROR - wrote %d instead\n", len));
X BUGR("Write error 2");
X if(ReSync(global, ioptr)) return(1);
X else goto TOP;
X }
X BUG(("%d written\n", len));
X }
X
X if(global->n.infoport)
X {
X struct Message *m;
X while(m=GetMsg(global->n.ntirec.m.mn_ReplyPort))
X {
X if(m == &global->n.ntirec.m)
X global->n.inuse_rec = 0;
X else
X global->n.inuse_trans = 0;
X }
X global->n.inf_trans += RPSIZE + global->RP.DLen;
X
X if(!global->n.inuse_trans)
X {
X BUG(("PutRPacket: Writing status info to port %lx: TRANSMIT %ld\n",
X global->n.infoport, global->n.inf_trans))
X
X global->n.ntitrans.nti_bytes = global->n.inf_trans;
X global->n.ntitrans.nti_direction = NTI_TRANSMIT;
X PutMsg(global->n.infoport, &global->n.ntitrans.m);
X
X global->n.inuse_trans = 1;
X global->n.inf_trans = 0;
X }
X#if DEBUG
X else
X BUG(("PutRPacket: Skipping status write, packet outstanding\n"))
X#endif
X }
X
X return(0);
X}
X
Xint GetRPacket(global, ioptr)
XNGLOBAL global;
XAPTR ioptr;
X{
X int len;
X
X BUG(("GetRPacket: reading %d from %lx. . .", RPSIZE, ioptr));
X
XTOP:
X if((len=DRead((struct DChannel *)ioptr,
X (char *)&global->RP, RPSIZE)) != RPSIZE)
X {
X BUG(("**********ERROR - read %d instead\n", len));
X BUGR("Read error")
X if(ReSync(global, ioptr)) return(1);
X else goto TOP;
X }
X
X BUG(("type %d, Args %lx %lx %lx %lx\n", global->RP.Type,
X global->RP.Arg1, global->RP.Arg2,
X global->RP.Arg3, global->RP.Arg4));
X
X if(global->RP.DLen > 0)
X {
X BUG(("Reading %d more. . .", global->RP.DLen));
X if((len=DRead((struct DChannel *)ioptr,
X global->RP.Data, global->RP.DLen)) != global->RP.DLen)
X {
X BUG(("**********ERROR - read %d instead\n", len));
X BUGR("Read error 2")
X if(ReSync(global, ioptr)) return(1);
X else goto TOP;
X }
X }
X else
X global->RP.Data[0] = '\0';
X
X BUG(("Done\n"))
X
X if(global->n.infoport)
X {
X struct Message *m;
X while(m=GetMsg(global->n.ntirec.m.mn_ReplyPort))
X {
X if(m == &global->n.ntirec.m)
X global->n.inuse_rec = 0;
X else
X global->n.inuse_trans = 0;
X }
X global->n.inf_rec += RPSIZE + global->RP.DLen;
X
X if(!global->n.inuse_rec)
X {
X BUG(("GetRPacket: Writing status info to port %lx: RECEIVE %ld\n",
X global->n.infoport, global->n.inf_rec))
X
X global->n.ntirec.nti_bytes = global->n.inf_rec;
X global->n.ntirec.nti_direction = NTI_RECEIVE;
X PutMsg(global->n.infoport, &global->n.ntirec.m);
X
X global->n.inuse_rec = 1;
X global->n.inf_rec = 0;
X }
X#if DEBUG
X else
X BUG(("GetRPacket: Skipping status write, packet outstanding\n"))
X#endif
X }
X
X return(0);
X}
X
SHAR_EOF
echo "extracting netcomm.h"
sed 's/^X//' << \SHAR_EOF > netcomm.h
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1988, 1989 The Software Distillery. All Rights */
X/* |. o.| || Reserved. This program may not be distributed without the */
X/* | . | || permission of the authors: BBS: */
X/* | o | || John Toebes Doug Walker Dave Baker */
X/* | . |// */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X
X
X/* If PARANOID is defined >0, requesters will pop up for debugging */
X/* during the startup. No need to define it unless we die before */
X/* getting far enough to start up debugging. */
X
X#define PARANOID 0
X
X/* Defining CPR >0 will link in code to do a busy wait when the CPRWAIT */
X/* debug packet is received. This allows CPR to catch the NET: task */
X/* and lets us proceed with debugging; if we are WAITing when CPR */
X/* catches us, we're dead in the water. */
X#define CPR 0
X
X/* Defining DEBUG >0 will link in code to print stuff to any debugging */
X/* filehandles provided us by HANDD. This slows us down quite a bit */
X/* since the BUG macros all call a subroutine to print their messages */
X/* even if we aren't debugging anything at the moment. */
X
X#ifdef DEBUG
X#undef DEBUG
X#endif
X
X#define DEBUG 0
X
X
X/* The NOEXT define is set by the including .c program to prevent system */
X/* include files from being reincluded here. It is only used in dnetlib */
X#ifndef NOEXT
X#include <exec/types.h>
X#include <exec/nodes.h>
X#include <exec/lists.h>
X#include <exec/ports.h>
X#include <exec/libraries.h>
X#include <exec/devices.h>
X#include <exec/io.h>
X#include <exec/memory.h>
X#include <exec/interrupts.h>
X#include <intuition/intuition.h>
X#include <devices/console.h>
X#include <devices/timer.h>
X#include <libraries/dos.h>
X#include <libraries/dosextens.h>
X#include <libraries/filehandler.h>
X#include <string.h>
X#include <stdlib.h>
X#ifdef MANX
X#define U_ARGS(a) () /* No support for prototypes - oh well */
X#else
X#define U_ARGS(a) a /* prototype checking to ensure all is well */
X#include <proto/exec.h>
X#include <proto/dos.h>
X#include <proto/timer.h>
X#endif
X#endif
X
X#ifndef min
X#define min(a,b) ((a)<(b)?(a):(b))
X#endif
X
X/* A macro to make good SAS Institute programmers feel at home */
X#define MQ(f,t,l) memcpy((char *)t,(char *)f,(int)l);
X
X#define MBSTR(f,t) memcpy((char *)t,(char *)f,(int)(*((char *)f))+1);
X#define BSTRLEN(s) ((int)(*((char *)(s))))
X
X#undef GLOBAL
X/* my version of BADDR() has no problems with casting */
X#undef BADDR
X#define BADDR(x) ((APTR)((long)x << 2))
X#define MKBADDR(x) ((BPTR)((long)x >> 2))
X
X/* Define a few packet types that may not be in the system include files */
X
X#ifdef ACTION_END
X#undef ACTION_END
X#endif
X#ifdef ACTION_SEEK
X#undef ACTION_SEEK
X#endif
X
X#define ACTION_FIND_WRITE 1004L
X#define ACTION_FIND_INPUT 1005L /* please refer to DOS Tech. Ref. */
X#define ACTION_FIND_OUTPUT 1006L
X#define ACTION_END 1007L
X#define ACTION_SEEK 1008L
X#ifndef ACTION_MORE_CACHE
X#define ACTION_MORE_CACHE 18L
X#endif
X#ifndef ACTION_FLUSH
X#define ACTION_FLUSH 27L
X#endif
X#define ACTION_SET_FILE_DATE 34L
X#define ACTION_SET_RAW_MODE 994L
X
X/* Private packets */
X#define ACTION_HANDLER_DEBUG 2010L
X#define ACTION_SET_TRANS_TYPE 2011L
X#define ACTION_NETWORK_HELLO 2012L
X
X
X#define ACTION_NETWORK_KLUDGE 4674764L /* Temporary until ROOT: done */
X
X
X#define ERROR_NODE_DOWN ERROR_OBJECT_NOT_FOUND
X
X#define DOS_FALSE 0L
X#define DOS_TRUE -1L /* BCPL "TRUE" */
X
Xtypedef char *RPTR; /* Pointer to remote node's memory */
X
Xtypedef int (*fptr)();
X
X#define RNAMELEN 16 /* Max 16 byte names for remote nodes */
X
Xtypedef struct TimerPacket {
X struct timerequest tm_req;
X struct DosPacket tm_pkt;
X};
X
X
X/* Define a struct to communicate with the NETSTAT program */
X#define NTI_TRANSMIT 0
X#define NTI_RECEIVE 1
X
Xstruct NetTransInfo
X{
X struct Message m;
X long nti_bytes; /* Number of bytes since last request */
X int nti_direction; /* NTI_TRANSMIT or NTI_RECEIVE */
X};
X
X/* The following defines the network buffer size. Reads/writes larger */
X/* than this amount will be broken up into smaller chunks. */
X/* Really should be set by querying the other side. */
X#define NETBUFSIZE 1024 /* Maximum amount of meaningful data to send */
X#define FILENAMELEN 120 /* Length of a filename */
X
Xstruct RPacket /* Packet sent to remote node */
X{
X LONG Type; /* Type of request (AmigaDos packet type) */
X RPTR RDevice; /* Pointer to remote MsgPort to send packet to */
X LONG Arg1, /* Equivalent to dp_Arg? in normal devices */
X Arg2, /* when transmitting, dp_Res? when receiving */
X Arg3,
X Arg4;
X long DLen; /* Length of data in Data buffer */
X char Data[NETBUFSIZE]; /* Data buffer */
X};
X
X#define RPSIZE (sizeof(struct RPacket) - NETBUFSIZE)
X
Xstruct NetGlobal
X{
X struct Process *self; /* my process */
X struct MsgPort *port; /* our message port */
X struct MsgPort *devport; /* msg port for device io */
X struct MsgPort *infoport; /* msg port for device status info */
X struct TimerPacket *timerpkt; /* pkt used for timer request */
X APTR devptr; /* Device-defined */
X int run; /* flag to continue running */
X int reply; /* flag to inhibit replying to message*/
X long ErrorCount; /* Error count for current volume */
X short histimeout; /* Other side's timeout length */
X short mytimeout; /* My timeout length */
X char *devname; /* pointer to device name */
X /* These are the fields of the autorequest structure we want to create */
X struct IntuiText line1; /* Top Line of requester */
X struct IntuiText line2; /* Second Line of requester */
X struct IntuiText line3; /* Bottom Line of requester */
X struct IntuiText retrytxt; /* Retry information */
X struct IntuiText canceltxt; /* CANCEL information */
X char buf3[16]; /* Buffer to hold unit information */
X int inuse_trans, inuse_rec; /* NetTransInfo struct is in use */
X long inf_trans, inf_rec; /* Bytes trans & rec while nti in use */
X struct NetTransInfo ntirec; /* Send receive info to stat window */
X struct NetTransInfo ntitrans; /* Send transmit info to stat window */
X union /* Union of driver-specific data - max one entry per driver */
X {
X struct MsgPort *LisPort; /* For DNET protocol */
X } d;
X};
X
Xtypedef struct
X{
X struct NetGlobal n;
X struct RPacket RP;
X struct DosPacket *pkt; /* the packet we are processing */
X} *NGLOBAL;
X
SHAR_EOF
echo "extracting netdev.h"
sed 's/^X//' << \SHAR_EOF > netdev.h
X
X/************************************************************************
X* *
X* Copyright (C) 1989, The Software Distillery. All Rights Reserved. *
X* *
X************************************************************************/
X
X
X
X#ifndef DEVICES_NETDEV_H
X#define DEVICES_NETDEV_H
X
X#ifndef EXEC_IO_H
X#include "exec/io.h"
X#endif !EXEC_IO_H
X
X#ifndef EXEC_DEVICES_H
X#include "exec/devices.h"
X#endif !EXEC_DEVICES_H
X
X
X
X/*
X *--------------------------------------------------------------------
X *
X * Driver Specific Commands
X *
X *--------------------------------------------------------------------
X */
X
X#define CHF_HANDLER (1<<15) /* for internal use only! */
X#define CHF_SERVER (1<<14) /* for internal use only! */
X
X/*
X *--------------------------------------------------------------------
X *
X * Commands with the CHF_HANDLER bit set are only allowed on the handler
X * unit. Reads and Writes with the handler bit set can only be
X * satisfied by Writes or Reads from the remote node with the CHF_SERVER
X * bit set.
X *
X *--------------------------------------------------------------------
X */
X#define HCH_READ (CMD_READ|CHF_HANDLER) /* Read data from a server*/
X#define HCH_WRITE (CMD_WRITE|CHF_HANDLER)/* Write data to a server */
X
X#define HCH_ATTACH ((CMD_NONSTD+0)|CHF_HANDLER) /* Attach to new server */
X#define HCH_DETACH ((CMD_NONSTD+1)|CHF_HANDLER) /* Detach from a server */
X#define HCH_STATUS ((CMD_NONSTD+2)|CHF_HANDLER) /* Give node status */
X#define HCH_ADDCHANGEINT ((CMD_NONSTD+3)|CHF_HANDLER) /* Install softint */
X#define HCH_REMCHANGEINT ((CMD_NONSTD+4)|CHF_HANDLER) /* Remove softint set */
X /* by ADDCHANGEINT */
X
X/*
X *--------------------------------------------------------------------
X *
X * Commands with the CHF_SERVER bit set are only allowed on the server
X * unit. Writes with the server bit set can only be satisfied by Reads
X * from the node specified in the io_Offset field that have the
X * CHF_HANDLER bit set. Reads with the server bit set are posted with an
X * io_Offset of -1 specified, and may be satisfied by a write with the
X * CHF_HANDLER bit set from any node.
X *
X *--------------------------------------------------------------------
X */
X#define SCH_READ (CMD_READ|CHF_SERVER) /* Read data from a handler */
X#define SCH_WRITE (CMD_WRITE|CHF_SERVER) /* Write data to a server */
X#define SCH_NAME (CMD_NONSTD+5|CHF_SERVER) /* Set new name */
X
X/*
X *--------------------------------------------------------------------
X *
X * Predefined unit numbers :
X * Handlers open the CHU_HANDLER unit; servers open the CHU_SERVER
X * unit. Commands with the CHF_HANDLER bit set are valid only on
X * the handler unit; commands with the CHF_SERVER bit set are valid
X * only on the server unit.
X *
X *--------------------------------------------------------------------
X */
X
X#define CHU_HANDLER -1 /* Handler unit number */
X#define CHU_SERVER -2 /* Server unit number */
X
X/*
X *--------------------------------------------------------------------
X *
X * Driver error defines
X *
X *--------------------------------------------------------------------
X */
X
X#define CHERR_NotSpecified 41 /* general catchall */
X#define CHERR_BadNodeID 42 /* Invalid node ID passed */
X#define CHERR_NodeDown 43 /* Specified node is down */
X#define CHERR_UnitInUse 44 /* Unit number in use */
X#define CHERR_BadRequest 45 /* IO request invalid or unknown */
X#define CHERR_IOErr 46 /* Physical I/O failure */
X#define CHERR_NameConflict 47 /* Name set request failed */
X
X#endif DEVICES_COMMHAND_H
SHAR_EOF
echo "extracting netdnet.h"
sed 's/^X//' << \SHAR_EOF > netdnet.h
X#ifndef NET_DNET
X#define NET_DNET
X
X#include "dnet.h"
X
X#define STDFNLEN 0
X
X#define PORT_FHANDLER 9492
X
X#define DNETTIMEOUT 2 /* tenths of a second */
X
X#endif
X
X
SHAR_EOF
echo "extracting proto.h"
sed 's/^X//' << \SHAR_EOF > proto.h
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery. All Rights */
X/* |. o.| || Reserved. This program may not be distributed without the */
X/* | . | || permission of the authors: BBS: */
X/* | o | || John Toebes Doug Walker Dave Baker */
X/* | . |// */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X
X#ifdef NETCOMMON
X#define GLOBAL NGLOBAL
X#endif
X
Xvoid cprwait U_ARGS((GLOBAL));
X
X#if PARANOID
Xextern int paranoid;
X#define BUGP(x) if(paranoid) paranoid=request(global, REQ_GENERAL, x);
X#else
X#define BUGP(x)
X#endif
X
X#if CPR
X/* Debugging routines */
Xvoid myputbstr U_ARGS((char *, ...));
Xvoid myputlstr U_ARGS((char *, ...));
Xvoid myprintf U_ARGS((char *, ...));
Xvoid xwrite U_ARGS((char *, int));
Xvoid xgetcr U_ARGS((void));
Xint sprintf U_ARGS((char *, char *, ...));
Xvoid mydump U_ARGS((char *, int));
XBPTR initdebug U_ARGS((BPTR));
Xvoid termdebug U_ARGS((void));
X
X#if DEBUG
X#define BUG(a) myprintf a;
X#define BUGBSTR(a,b) myputbstr(a,b);
X#define BUGLSTR(a,b,c) myputlstr(a,b,c);
X#define BUGGETC xgetcr();
X#define BUGTERM() termdebug();
X#define BUGR(x) request(global, REQ_GENERAL, x);
X
X#else
X
X#define BUG(a)
X#define BUGBSTR(a,b)
X#define BUGLSTR(a,b,c)
X#define BUGGETC
X#define BUGTERM()
X#define BUGR(x)
X#endif
X
X#else
X
X#define BUG(a)
X#define BUGBSTR(a,b)
X#define BUGLSTR(a,b,c)
X#define BUGGETC
X#define BUGTERM()
X#define BUGR(x)
X#endif
X
Xextern struct DosLibrary *DOSBase;
X#define alloc(a,b) DosAllocMem(a,b)
X#define free(p) DosFreeMem(p)
X
X/* io#?.c */
Xint PutRPacket U_ARGS((GLOBAL, APTR));
Xint GetRPacket U_ARGS((GLOBAL, APTR));
X
X/* Subs.c */
Xstruct DosPacket *taskwait U_ARGS((GLOBAL));
Xvoid retpkt U_ARGS((GLOBAL, struct DosPacket *));
Xchar *DosAllocMem U_ARGS((GLOBAL, long));
Xvoid DosFreeMem U_ARGS((char *));
Xlong sendpkt U_ARGS((struct MsgPort *, long, long*, long));
XLONG checksum U_ARGS((char *, int));
Xvoid CheckRP U_ARGS((struct RPacket *));
X
X/* pause.c */
Xint Pause U_ARGS((ULONG));
X
X/* net#?.c */
Xint ReSync U_ARGS((GLOBAL, APTR));
X
X/* timer.c */
Xint OpenTimer U_ARGS((GLOBAL, struct MsgPort *));
Xvoid CloseTimer U_ARGS((GLOBAL));
Xvoid PostTimerReq U_ARGS((GLOBAL, int));
X
X/* request.c */
Xint request U_ARGS((GLOBAL, int, char *));
X#define REQ_MUST 0
X#define REQ_ERROR 1
X#define REQ_GENERAL 2
SHAR_EOF
echo "extracting request.c"
sed 's/^X//' << \SHAR_EOF > request.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1988 The Software Distillery. All Rights Reserved */
X/* |. o.| || This program may not be distributed without the permission of */
X/* | . | || the authors: BBS: (919) 481-6436 */
X/* | o | || John Toebes John Mainwaring Jim Cooper */
X/* | . |// Bruce Drake Gordon Keener Dave Baker */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X
X#define NETCOMMON
X#include "netcomm.h"
X#include "proto.h"
X#include <proto/intuition.h>
X
Xint request(global, reqnum, msg)
XNGLOBAL global;
Xint reqnum;
Xchar *msg;
X{
X/* Possible requesters that we can see at this time */
X/* 1:
X You MUST replace volume
X xxxxx
X in Unit 0 !!!
X
X 2: I/O Error on volume
X xxxxx
X in Unit 0
X
X ?: Unknown Error with volume
X xxxxx
X in Unit 0
X*/
X
X#if 0
X if (global->volume == NULL)
X#endif
X {
X *(long *)&global->n.line3.LeftEdge = 0x0004000EL; /* 4,4 */
X global->n.line1.NextText = &global->n.line2;
X }
X#if 0
X else
X {
X global->n.line1.NextText = &global->n.line2;
X global->n.line2.IText = (UBYTE *)BADDR(global->volume->dl_Name)+1;
X global->n.line2.NextText = &global->n.line3;
X }
X#endif
X global->n.line3.IText = (UBYTE *)&global->n.buf3;
X *(long *)&global->n.buf3[0] = ('i'<<24)|('n'<<16)|(' '<<8)|'U';
X *(long *)&global->n.buf3[4] = ('n'<<24)|('i'<<16)|('t'<<8)|' ';
X *(long *)&global->n.buf3[8] = ('0'<<24)|(' '<<16)|('!'<<8)|'!';
X /*global->n.buf3[8] += global->unitnum;*/
X global->n.buf3[12] = 0;
X
X switch(reqnum)
X {
X case REQ_MUST:
X global->n.line1.IText = "You MUST replace volume";
X break;
X case REQ_ERROR:
X global->n.line1.IText = "I/O Error on volume";
X global->n.buf3[9] = 0;
X break;
X case REQ_GENERAL:
X global->n.line1.IText = msg;
X global->n.buf3[9] = 0;
X break;
X default:
X global->n.line1.IText = "Unknown error on volume";
X break;
X }
X
X /* Now we need to put up the requester */
X if (IntuitionBase == NULL)
X IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
X /* We probably should check and put up an alert.. but later on that */
X
X /* Now display the requester */
X return(AutoRequest(NULL, &global->n.line1,
X &global->n.retrytxt, &global->n.canceltxt,
X DISKINSERTED, 0,
X 320, 72));
X}
X
X
SHAR_EOF
echo "extracting sendpkt.c"
sed 's/^X//' << \SHAR_EOF > sendpkt.c
X/* From: ConPackets.c - C. Scheppner, A. Finkel, P. Lindsay CBM
X * DOS packet example
X * Requires 1.2
X *
X */
X#include <exec/types.h>
X#include <exec/ports.h>
X#include <exec/memory.h>
X#include <libraries/dos.h>
X#include <libraries/dosextens.h>
X#include <proto/exec.h>
X#include <proto/dos.h>
X
XLONG sendpkt(struct MsgPort *, LONG, LONG *, LONG);
X
XLONG sendpkt(pid,action,args,nargs)
Xstruct MsgPort *pid; /* process indentifier ... (handlers message port ) */
XLONG action, /* packet type ... (what you want handler to do ) */
X args[], /* a pointer to a argument list */
X nargs; /* number of arguments in list */
X {
X struct MsgPort *replyport;
X struct StandardPacket *packet;
X
X LONG count, *pargs, res1;
X
X replyport = (struct MsgPort *) CreatePort(NULL,0);
X if(!replyport) return(NULL);
X
X packet = (struct StandardPacket *)
X AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);
X if(!packet)
X {
X DeletePort(replyport);
X return(NULL);
X }
X
X packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
X packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
X packet->sp_Pkt.dp_Port = replyport;
X packet->sp_Pkt.dp_Type = action;
X
X /* copy the args into the packet */
X pargs = &(packet->sp_Pkt.dp_Arg1); /* address of first argument */
X for(count=0;count < nargs;count++)
X pargs[count]=args[count];
X
X PutMsg(pid,(struct Message *)packet); /* send packet */
X
X WaitPort(replyport);
X GetMsg(replyport);
X
X res1 = packet->sp_Pkt.dp_Res1;
X
X FreeMem((char *)packet,(long)sizeof(struct StandardPacket));
X DeletePort(replyport);
X
X return(res1);
X}
SHAR_EOF
if `test ! -d server`
then
mkdir server
echo "mkdir server"
fi
echo "extracting server/device.c"
sed 's/^X//' << \SHAR_EOF > server/device.c
X/* Device.c - Device support routines */
X
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1987 The Software Distillery. All Rights Reserved*/
X/* |. o.| || This program may not be distributed without the permission of */
X/* | . | || the author. BBS: */
X/* | o | || John Toebes Dave Baker (919)-471-6436*/
X/* | . |// */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X
X#include "server.h"
X
Xint InitDevice(global)
XGLOBAL global;
X{
X int rc;
X struct StandardPacket *sp;
X BUGP("InitDevice: Entry")
X BUG(("InitDevice: Entry\n"));
X
X if ((global->n.devport = (struct MsgPort *)CreatePort(NULL,0))==NULL)
X {
X BUG(("********CreatePort Failed\n"));
X BUGR("Can't init server")
X return(1); /* error in createport */
X }
X
X if(!(sp = global->stdpkt = (struct StandardPacket *)
X AllocMem(sizeof(struct StandardPacket),MEMF_CLEAR)))
X {
X BUG(("********Couldn't allocate StandardPacket!!\n"));
X BUGR("No memory!")
X return(1);
X }
X sp->sp_Msg.mn_Node.ln_Name = (char *)(global->pkt= &(sp->sp_Pkt));
X sp->sp_Pkt.dp_Link = &(sp->sp_Msg);
X
X if(!(global->dosport=(struct MsgPort *)DeviceProc("ROOT:")) &&
X !(global->dosport=(struct MsgPort *)DeviceProc("SYS:")))
X {
X BUG(("********DeviceProc of ROOT: and SYS: Failed\n"));
X BUGR("No DeviceProc")
X return(1);
X }
X global->RP.RDevice = (RPTR)global->dosport;
X
X OpenTimer(global, global->n.port);
X
X rc = InitRDevice(global);
X
X BUGP("InitDevice: Exit")
X return(rc);
X}
X
Xint TermDevice(global)
XGLOBAL global;
X{
X CloseTimer(global);
X TermRDevice(global);
X return(1);
X}
X
Xvoid RmtDie(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X{
X if(--global->n.run == 1) global->n.run = 0;
X}
SHAR_EOF
echo "extracting server/dir.c"
sed 's/^X//' << \SHAR_EOF > server/dir.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery. All Rights */
X/* |. o.| || Reserved. This program may not be distributed without the */
X/* | . | || permission of the authors: BBS: */
X/* | o | || John Toebes Doug Walker Dave Baker */
X/* | . |// */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* Directory Manipulation */
X/* RmtCreateDir RmtExamine RmtExNext RmtParent */
X#include "server.h"
X
Xvoid RmtCreateDir(global,pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X/* Arg1 - Lock */
X/* Arg2 - name */
X/* Arg3 (optional) Attributes */
X{
X BUG(("RmtCreateDir\n"));
X BUGBSTR("Creating directory '%s'\n", global->RP.Data);
X
X pkt->dp_Arg1 = global->RP.Arg1;
X MBSTR(global->RP.Data, global->fib);
X pkt->dp_Arg2 = (LONG)MKBADDR(global->fib);
X pkt->dp_Arg3 = global->RP.Arg3;
X
X Dispatch(global);
X
X global->RP.DLen = 0;
X}
X
Xvoid RmtExamine(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X/* Arg1: Lock of object to examine */
X/* Arg2: FileInfoBlock to fill in */
X{
X#if DEBUG
X struct FileInfoBlock *fib;
X#endif
X BUG(("RmtExamine/RmtExNext - lock %lx\n", global->RP.Arg1));
X
X pkt->dp_Arg1 = global->RP.Arg1;
X pkt->dp_Arg2 = (LONG)MKBADDR(global->fib);
X MQ(global->RP.Data, global->fib, sizeof(struct FileInfoBlock));
X
X Dispatch(global);
X
X#if DEBUG
X fib = (struct FileInfoBlock *)global->fib;
X BUG(("RmtEx: FIB name='%s' size=%ld numblocks=%ld\n",
X fib->fib_FileName+1, fib->fib_Size, fib->fib_NumBlocks));
X#endif
X
X MQ(global->fib, global->RP.Data, sizeof(struct FileInfoBlock));
X
X global->RP.DLen = sizeof(struct FileInfoBlock);
X}
X
Xvoid RmtParent(global,pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X/* Arg1 - Lock */
X{
X BUG(("RmtParent\n"));
X
X pkt->dp_Arg1 = global->RP.Arg1;
X
X Dispatch(global);
X
X global->RP.DLen = 0;
X}
X
SHAR_EOF
echo "extracting server/dispatch.c"
sed 's/^X//' << \SHAR_EOF > server/dispatch.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
X* |_o_o|\\ Copyright (c) 1988 The Software Distillery. All Rights Reserved *
X* |. o.| || Written by Doug Walker *
X* | . | || The Software Distillery *
X* | o | || 235 Trillingham Lane *
X* | . |// Cary, NC 27513 *
X* ====== BBS:(919)-471-6436 *
X\* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X
X#include "server.h"
X
Xvoid Dispatch(global)
XGLOBAL global;
X{
X BUG(("Dispatch: Entry\n"))
X
X /* This must be done each time - do not try to move it to InitDevice */
X global->stdpkt->sp_Pkt.dp_Port = global->n.port;
X
X#if 1
X if(global->RP.RDevice == NULL || global->RP.RDevice == (RPTR)1)
X global->RP.RDevice = (RPTR)global->dosport;
X
X PutMsg((struct MsgPort *)global->RP.RDevice,
X (struct Message *)global->stdpkt);
X#else
X PutMsg(global->dosport, (struct Message *)global->stdpkt);
X#endif
X
X WaitPort(global->n.port);
X
X GetMsg(global->n.port);
X
X BUG(("Dispatch: local RC = %lx, %lx\n",
X global->pkt->dp_Res1, global->pkt->dp_Res2));
X global->RP.Arg1 = global->pkt->dp_Res1;
X global->RP.Arg2 = global->pkt->dp_Res2;
X
X return;
X}SHAR_EOF
echo "extracting server/file.c"
sed 's/^X//' << \SHAR_EOF > server/file.c
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* |_o_o|\\ Copyright (c) 1987, 1988 The Software Distillery. All Rights */
X/* |. o.| || Reserved. This program may not be distributed without the */
X/* | . | || permission of the authors: BBS: */
X/* | o | || John Toebes Doug Walker Dave Baker */
X/* | . |// */
X/* ====== */
X/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
X/* File Manipulation */
X/* ActDelete ActRename ActSetProtection ActSetComment */
X#include "server.h"
X
Xvoid RmtDelete(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt; /* a pointer to the dos packet sent */
X/* Arg1: Lock */
X/* Arg2: Name */
X{
X BUG(("RmtDelete, lock %lx\n", global->RP.Arg1));
X BUGBSTR("File to delete is ", global->RP.Data);
X
X pkt->dp_Arg1 = global->RP.Arg1;
X MBSTR(global->RP.Data, global->fib);
X pkt->dp_Arg2 = (LONG)MKBADDR(global->fib);
X
X Dispatch(global);
X
X global->RP.DLen = 0;
X}
X
Xvoid RmtRename(global,pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X/* Arg1: FromLock */
X/* Arg2: FromName */
X/* Arg3: ToLock */
X/* Arg4: ToName */
X{
X char *name;
X BUG(("RmtRename\n"));
X BUGBSTR("Renaming ", global->RP.Data);
X BUGBSTR("New Name ", global->RP.Data+FILENAMELEN);
X
X pkt->dp_Arg1 = global->RP.Arg1;
X MBSTR(global->RP.Data, global->fib);
X pkt->dp_Arg2 = (LONG)MKBADDR(global->fib);
X pkt->dp_Arg3 = global->RP.Arg3;
X name = ((char *)global->fib)+FILENAMELEN;
X MBSTR(global->RP.Data+FILENAMELEN, name);
X pkt->dp_Arg4 = (LONG)MKBADDR(name);
X
X Dispatch(global);
X
X global->RP.DLen = 0;
X}
X
Xvoid RmtSetProtection(global, pkt)
XGLOBAL global;
Xstruct DosPacket *pkt;
X/* Arg1: Unused */
X/* Arg2: Lock */
X/* Arg3: Name */
X/* Arg4: Mask of protection */
X{
X BUG(("RmtSetProtection\n"));
X
X BUGBSTR("File to protect: ", global->RP.Data);
X
X pkt->dp_Arg2 = global->RP.Arg2;
X MBSTR(global->RP.Data, global->fib);
X pkt->dp_Arg3 = (LONG)MKBADDR(global->fib);
X pkt->dp_Arg4 = global->RP.Arg4;
X
X Dispatch(global);
X
X global->RP.DLen = 0;
X}
X
Xvoid RmtSetComment(global,pkt)
XGLOBAL global;
Xstruct DosPacket *pkt; /* a pointer to the dos packet sent */
X/* Arg1: Unused */
X/* Arg2: Lock */
X/* Arg3: Name */
X/* Arg4: Comment */
X{
X char *comment;
X BUG(("RmtSetComment\n"));
X
X BUGBSTR("File to Comment: ", global->RP.Data);
X BUGBSTR("New Comment Str: ", global->RP.Data+FILENAMELEN);
X
X pkt->dp_Arg2 = global->RP.Arg2;
X MBSTR(global->RP.Data, global->fib);
X pkt->dp_Arg3 = (LONG)MKBADDR(global->fib);
X comment = ((char *)global->fib)+FILENAMELEN;
X MBSTR(global->RP.Data+FILENAMELEN, comment);
X pkt->dp_Arg4 = (LONG)MKBADDR(comment);
X
X Dispatch(global);
X
X global->RP.DLen = 0;
X}
SHAR_EOF
echo "End of archive 3 (of 4)"
# if you want to concatenate archives, remove anything after this line
exit